package luckUser

import (
	"github.com/gin-gonic/gin"
	"my-systems/pet-system/internal/middleware"
	"my-systems/pet-system/internal/service"
	"my-systems/pet-system/pkg/e"
	"my-systems/pet-system/pkg/tools"
	"net/http"
)

// 用户登录
func LoginUser(ctx *gin.Context) {
	userTmp := &service.UserService{}
	// 绑定结构体
	err := ctx.ShouldBind(userTmp)
	if err != nil {
		tools.Logger.Error(err.Error())
		ctx.JSON(400, gin.H{"error": err.Error()})
		return
	}
	res := userTmp.LoginUser()
	ctx.JSON(http.StatusOK, res)
}

// 注册用户
func RegisterUser(ctx *gin.Context) {
	userTmp := &service.UserService{}
	err := ctx.ShouldBind(userTmp)
	if err != nil {
		tools.Logger.Error(err.Error())
		ctx.JSON(400, gin.H{"error": err.Error()})
		return
	}
	res := userTmp.RegisterUser()
	ctx.JSON(http.StatusOK, res)

}

// 更新用户信息-昵称、头像、手机号、邮箱、地址、性别、生日、密码
func UpdateUser(ctx *gin.Context) {
	userTmp := &service.UserService{}
	err := ctx.ShouldBind(userTmp)
	if err != nil {
		tools.Logger.Error(err)
		ctx.JSON(400, gin.H{"error": err.Error()})
		return
	}

	// 从gin.Context中获取token信息
	tokenClaims, exists := ctx.Get("claims")
	if !exists {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": e.SuspectedTokenDoesNotExist,
			"msg":  e.GetMsgInfo(e.SuspectedTokenDoesNotExist),
		})
		return
	}
	claims, ok := tokenClaims.(*tools.Claims)
	if !ok {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"error": "用户信息类型错误",
		})
		return
	}

	// 更新用户信息 --> 用户名，手机号，地址，性别，生日
	res := userTmp.UpdateUser(claims.ID)
	ctx.JSON(http.StatusOK, res)
}

// 充值
func Recharge(ctx *gin.Context) {
	// 模拟充值
	userTmp := &service.UserService{}
	err := ctx.ShouldBind(userTmp)
	if err != nil {
		tools.Logger.Error(err)
		ctx.JSON(400, gin.H{"error": err.Error()})
		return
	}
	tokenClaims, exist := ctx.Get("claims")
	if !exist {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": e.SuspectedTokenDoesNotExist,
			"msg":  e.GetMsgInfo(e.SuspectedTokenDoesNotExist),
		})
		return
	}
	claims, ok := tokenClaims.(*tools.Claims)
	if !ok {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"error": "用户信息类型错误",
		})
		return
	}

	res := userTmp.RechargeSQL(claims.ID)
	ctx.JSON(http.StatusOK, res)
}

func UpAvatar(ctx *gin.Context) {
	userTmp := &service.UserService{}
	tokenClaims, exist := ctx.Get("claims")
	if !exist {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": e.SuspectedTokenDoesNotExist,
			"msg":  e.GetMsgInfo(e.SuspectedTokenDoesNotExist),
		})
		return
	}
	claims, ok := tokenClaims.(*tools.Claims)
	if !ok {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"error": "用户信息类型错误",
		})
		return
	}

	// 1.获取头像文件
	file, fileHeader, err := ctx.Request.FormFile("avatar")
	if err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"error": "未上传头像文件",
		})
		return
	}
	defer file.Close()
	// 2.检查文件头
	if fileHeader == nil {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"error": "文件头为空",
		})
		return
	}
	// 3.获取文件信息
	//fileSize := fileHeader.Size
	//fileName := fileHeader.Filename

	res := userTmp.UpAvatar(claims.ID, file)
	ctx.JSON(http.StatusOK, res)

}

// 查看用户余额
func CatMoney(ctx *gin.Context) {
	userTmp := &service.UserService{}
	err := ctx.ShouldBind(userTmp)
	if err != nil {
		tools.Logger.Error(err)
		ctx.JSON(400, gin.H{"error": err.Error()})
		return
	}
	tokenClaims, exist := ctx.Get("claims")
	if !exist {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": e.SuspectedTokenDoesNotExist,
			"msg":  e.GetMsgInfo(e.SuspectedTokenDoesNotExist),
		})
		return
	}
	claims, ok := tokenClaims.(*tools.Claims)
	if !ok {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"error": "用户信息类型错误",
		})
		return
	}

	res := userTmp.CatMoneySQL(claims.ID)
	ctx.JSON(http.StatusOK, res)
}

// 退出登录
func OutLogin(ctx *gin.Context) {
	/*
		客户端清除 Token：客户端需要清除存储的 Token，比如存储在 Cookie 或 LocalStorage 中的 Token。
	*/
	tokenString := ctx.GetHeader("Authorization")
	if tokenString == "" {
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": e.SuspectedTokenDoesNotExist,
			"msg":  e.GetMsgInfo(e.SuspectedTokenDoesNotExist),
		})
		return
	}
	// 解析 Token
	claims, err := tools.ParseToken(tokenString)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"error": "解析 Token 失败",
		})
		return
	}

	// 将 Token 添加到黑名单
	middleware.BlacklistMutex.Lock()
	middleware.TokenBlacklist[tokenString] = claims.ExpiresAt.Time
	middleware.BlacklistMutex.Unlock()

	// 清除token
	//ctx.SetCookie("token", "", -1, "/", "", false, true)
	ctx.JSON(http.StatusOK, gin.H{
		"code": http.StatusOK,
		"msg":  "退出登录成功",
	})
}
